﻿#include<filesystem>
#include"./UnitConfig.hpp"
#include"../../Base/Config/CfgDefine.hpp"
#include"../../Base/Config/CfgParseTools.hpp"
#include"../../Third/yaml/include/yaml-cpp/yaml.h"

namespace MMF
{

    MMFUnitConfig* MMFUnitConfig::sInstance = nullptr;
    std::once_flag MMFUnitConfig::sFlag;
    MMFUnitConfig& MMFUnitConfig::Instance()
    {
        std::call_once(sFlag, []{
            sInstance = new MMFUnitConfig();
            sInstance->Start();
        });

        return *sInstance;
    }


    bool MMFUnitConfig::ParseCfg()
    {
        if (!std::filesystem::exists(UNIT_CFG_FILE))
            return false;
        
        YAML::Node root;
        try 
        {
            //加载配置
            root = YAML::LoadFile(UNIT_CFG_FILE);
            YAML::Node globals = root["Globals"];
            
            //解析配置
            mGlobalCfg.mBufferCount = globals["BufferCount"].as<uint64_t>();

             YAML::Node Apps = root["Apps"];
             mUnitCpt = CfgParseTools::ParseUnitComponent(Apps);
            
        }
        catch(...)
        {
            return false;
        }

        mIsLoad = true;
        return true;
    }


    bool MMFUnitConfig::Start()
    {
        if (mIsLoad)
            return true;
        return ParseCfg();
    }


    uint64_t MMFUnitConfig::GetBufferCount()
    {
        return mGlobalCfg.mBufferCount;
    }


    const std::vector<MMFUnitCpt>& MMFUnitConfig::UnitApp()
    {
        return mUnitCpt;
    }
}